1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | split the variable path into an array, and determine some object characteristics TO DO: objects and arrays should automatically close, as it is possible that this variable is the last one ========================================================================================================*) //TO DO: use SPLIT function to create an array first, then loop through the array WHILE (StringIndex > 0) DO IF (NameStringPtr^[StringIndex] = ASCII.DOT) THEN //found a "." character VarNameBegin:= StringIndex + 1; //clear array string TO DO: IS THIS NECESSARY? Sysmem.SysMemSet( pDest:= ADR(_VarNameArray[VarNameIndex]), udiValue:= 0, udiCount:= GPL_JSON.MAX_NAME_SIZE ); //copy string between VarNameBegin and VarNameEnd SysMem.SysMemCpy( pSrc:= ADR(NameStringPtr^[VarNameBegin]), udiCount:= INT_TO_UDINT((VarNameEnd - VarNameBegin)+1) //remove leading _ from the name, if present _VarNameArray[VarNameIndex].Name:= RIGHT(STR:= _VarNameArray[VarNameIndex].Name, SIZE:= LEN(_VarNameArray[VarNameIndex].Name) - 1); END_IF startarraystr:= FIND(STR1:= _VarNameArray[VarNameIndex].Name, STR2:= '['); //highest variable name is always two less than the Application index _ParentVar:= VarNameIndex - 2; EXIT; VarNameIndex:= VarNameIndex + 1; //====================JSON OBJECT CHARACTERISTICS==================== //check for valid reference--will be invalid when FB_Init is run on the first instance of JSONVAR //if objects have shifted down, then i-offset will never point to PrevNameArray[1] //the previous variable might need an array closed IF (PrevNameArray[1].ArrayIndex > 0) THEN //end array PrevNameArray[1].EndArray:= TRUE; END_IF PrevNameArray[prevvarlevelindex].EndObject:= TRUE; //close previous object END_IF IF (_VarNameArray[varlevelindex].ArrayIndex = 1) AND (PrevNameArray[prevvarlevelindex].ArrayIndex = 0) THEN //new array _VarNameArray[varlevelindex].NewArray:= TRUE; _VarNameArray[varlevelindex].NewObject:= TRUE; //new object at this level END_FOR ELSE bInitRetains : BOOL; // TRUE: the retain variables are initialized (reset warm / reset cold) |